在開始實際操作 LLM 之前,我們先來瞭解 LLM 的訓練流程。訓練一個 LLM 通常包含兩個步驟:監督式微調與增強式學習,不過也有許多模型只做監督式微調而不做增強式學習。這套訓練流程在 OpenAI 的 InstructGPT 論文中有完整的描述,李宏毅教授也發過一部影片講解非常清晰,推薦大家可以去看看。
(Powered By Microsoft Designer)
監督式微調 (Supervised Fine-Tuning) 其本質是在描述傳統訓練深度學習模型的一個步驟,在 LLM 裡面這個步驟又分成預訓練與指令微調兩個子步驟。
預訓練 (Pretraining) 階段會使用大量文本作為訓練資料,這些資料來源通常是網路爬蟲、維基百科、電子書文本等等,並且經過精細的資料前處理而來。這些資料透過因果語言建模 (Causal Language Modeling) 的訓練手法放進模型裡面。
這個階段,語言模型只會學習如何進行文字接龍。這時候訓練出來的模型,通常不具備任何問答或聊天的能力,只會根據已知的輸入句,預測接下來的文字機率分佈,並在多次取樣後形成一個自然的語句。
即便只是個文字接龍模型,但 LLM 也是在這個時候累積大量的世界知識 (World Knowledge) 在裡面,因此也可以把 Pretrained LLM 當作富有智慧的隱者,他只是不知道如何跟我們互動而已。
指令微調 (Instruction Fine-Tuning) 的概念是在描述將一個自然語言的任務當作一組組的 QA Pairs 來表示。以情感分類的任務來說,以往在資料裡面只會有這種格式的資料:
我很開心 => Positive
我好難過 => Negative
但如果表示為 Instruction 格式的話,可能就會像這樣:
指令:請問以下文句的情感分類為何?
輸入:我很開心
輸出:Positive
這樣的做法讓資料集產生了更貼近自然語言的文句因果關係。我們把這個因果關係強烈的自然語言描述丟進解因果能力強大的 Pretrained LLM 裡面,神奇的事情就此發生了,LLM 學會了如何回答問題!這就是俗稱「語言模型社會化」的過程。在這個階段,語言模型主要在學習識別任務的能力。也就是說,語言模型其實本來就具備執行此任務的能力,但他只是不知道什麼時候該發動這個能力。
就好像到霍格華茲上學之前的哈利波特,體內擁有強大的魔法能量 (Pretrained),但是他不知道如何控制自己的能力,所以常常在他身邊發生奇怪的魔法現象,沒有人願意跟他當朋友。但是他去學校學會了許多魔咒 (Instruction) 之後,就有辦法根據情況施展法術來解決問題,拯救魔法世界,打敗佛地魔,最後成功娶了金妮回家 ((x
去學校上學之前的哈利波特,就像是一個具有強大魔法能量的預訓練模型。去過學校上課之後的哈利波特,就像指令微調過後的模型,就學會了如何透過魔咒來引導魔力變成實際的法術。
另外,有些時候也會看到對話微調 (Chat Fine-Tuning) 一詞,這個動作的內容其實與指令微調十分相似,但對話微調一詞更著重在表達應用階段時的對話能力,例如模型打招呼的能力、模型自我介紹的能力等等。除此之外,也需要建立一個能夠讓前端應用解析的格式,例如:
### User: 你好啊,請問你是誰?
### Assistant: 你好,我是 Assistant 助手,有什麼我能幫助您的嗎?
在上面的範例中,除了建立模型打招呼與自我介紹的能力以外,前端應用也可以透過偵測 ###
是否出現,來確定 LLM 是否完成回答。
現在談論到 LLM 的訓練方法時,通常都會將 Instruction Tuning 與 Chat Fine-Tuning 兩個概念合在一起,去仔細區分這兩者的意義已經不大。但有些研究依然會將這兩個方法分開來談,所以看到分開來講的也不用覺得太奇怪。
增強式學習 (Reinforcement Learning, RL) 是泛用於各種領域的一個訓練手法,最有名的例子就是訓練一個 AI 玩遊戲。讓模型扮演玩家 (Agent) 並根據一套決策演算法 (Policy) 來進行動作 (Action),例如現在要移動還是射擊。而這個動作會產生一個分數 (Reward) 用來代表玩家現在的表現如何,像是玩家獲得的金錢、獎勵等等。而 RL 訓練的目的就是為了最大化獲得的分數。
而放在 LLM 裡面,模型本身就是玩家。會根據使用者的輸入產生一段文字,這段文字就是玩家的動作。接著由人類來評分這段文字的好壞,回答是否正確?是否詳細?是否符合需求?如果喜歡的話,就幫他點個讚,因此形成了分數。
對 LLM 進行 RL 的訓練,其目的在於讓模型的輸出變得更符合人類的喜好。換言之,這個階段的模型已經具備解答問題的能力,但是回覆的內容可能還不夠好,例如解釋的不夠詳細、摘要的長度太長、翻譯的細節太少等等。還有很重要的一點,就是要防止模型產生有害的輸出。這時候,就可以透過 RL 的訓練手法加強 LLM 的能力。
在 InstructGPT 裡面,使用從人類反饋中進行強化學習 (Reinforcement Learning from Human Feedback, RLHF) 這個做法。因為要從人類反饋中進行學習,所以需要先將人類反饋訓練成一個獎勵模型。
獎勵模型 (Reward Model, RM) 主要用來對 LLM 的輸出進行排名,我們將兩個或數個句子輸入到 RM 裡面,而 RM 會對這些句子輸出一個排名,用來代表這些句子之間誰的品質更好。根據 InstructGPT 論文所述,這個 RM 也是個 GPT 模型,但是只有 6B 的參數量。除了可以節省運算量以外,論文做法也發現使用太大的 RM 反而有不穩定的現象出現。
如何訓練一個 RM 呢?我們需要先請人對 LLM 的輸出進行排名,在 InstructGPT 裡面提到 RM 的訓練資料約三萬多筆,是個說大不大說小不小的數字。這也是為什麼 RLHF 的做法在其他 LLM 裡面比較不常見,即便 RL 需要的運算量遠小於預訓練,但 RM 的訓練資料獲取方法還是相對困難的。
除了這種根據人類排名的資料集訓練出來的獎勵模型以外,也有像是 GPT-Score 透過 LLM 幫我們打分數的方法,減輕對人工標注資料集的需求。
(圖源:GPT-Score)
近端策略優化 (Proximal Policy Optimization, PPO) 是 RLHF 裡面採取的策略,這個策略的出發點在於避免太大的策略更新。
(圖源:Deep RL Course - Intuition Behind PPO)
如上圖所見,如果突然往奇怪的方向更新了一大步,那可能就會掉落懸崖,然後再也爬不回來。之所以需要 PPO 是因為在 RL 之前的 LLM 其實已經有很好的文字生成能力了,只是需要再調整一下回覆而已,開發者希望 RL 的過程不要對 LLM 帶來太大的破壞,因此採用了 PPO 的策略。
因為 RM 無論是訓練資料還是模型本身都太難取得了,於是出現了 Direct Preference Optimization, DPO 這種方法。簡單來說就是省去了 Reward Model 這一段,直接把 LLM 本身當成 Reward 的來源並進行訓練,這樣的方法大幅簡化了整個 RLHF 的過程,節省更多的運算量與訓練成本。
RL 這門學問真的相當複雜,而且也是一個還在快發發展變化中的技術,掌握 RL 的訣竅也是相對困難。由 Hugging Face 開發的 TRL 套件替我們整合了整個 Transformer 模型會用到的強化學習演算法,讓我們可以簡單的操作整個強化學習的框架。
(圖源:TRL)
在 TRL 框架中,可以使用 SFTTrainer
, RewardTrainer
, PPOTrainer
等類別,來操作一個完整的 RLHF 流程。另外也有 DPOTrainer
等其他訓練方法可以選擇,給各位想嘗試強化學習的朋友參考看看!
TRL - Official Docs | GitHub
今天介紹了 LLM 常見的訓練流程,包含監督式微調 (SFT) 與增強式學習 (RL) 等,瞭解這個流程有助於我們更進一步理解 LLM 的本質。多數的研究都還是著重在 SFT 這塊,但 RL 也是相當重要的一環,尤其是目標為訓練 Local LLM 進行複雜的文字任務,例如摘要、翻譯或問答等等。
接下來將會介紹如何實際在自己的本地機器上使用 LLM 進行推論,在此之前會先講講令 AI 工程師相當胃痛的開發環境建構,筆者先去準備胃藥了,各位明天見啦!